二叉树排序算法

二叉树排序的基本原理:先构建一颗空树,使用第一个元素作为根节点,如果之后的元素比第一个小,则放到左子树,否则放到右子树,之后按中序遍历。
时间复杂度:nlog2(n)

空间复杂度:中序遍历时,需要构建栈,为logn.

二叉搜索树的性质:

(1)每个结点都有一个作为搜索依据的关键码(key)也就是数据域,所有节点的关键码互不一样。

(2)左子树(如果存在)上的所有结点的关键码都小于根结点的关键码。

(3)右子树(如果存在)上的所有结点的关键码都大于根结点的关键码。

(4)左右子树也是二叉搜索树。

代码:

#include "StdAfx.h"
#include<stdio.h>
#include<malloc.h>
#define STACK_INCREMENT  10
#define STACK_INIT_SIZE 100
#define MAXSIZE         50
 
//二叉排序树的链式存储结构
typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
 
//栈的顺序存储结构
typedef struct
{
	BiTree *base;
	BiTree *top;
	int stacksize;
}Sqstack;
 
//初始化一个栈,用于二叉树的中序遍历
void InitStack(Sqstack&S)
{
	S.base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
	if(!S.base)
		exit(0);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
}
 
 
//二叉排序树查找
void SearchBST(BiTree T,int key,BiTree f,BiTree&p)
{
	if(!T) 
		p=f;
	else if(T->data==key)
		p=T;
	else if(T->data<key)
		SearchBST(T->rchild,key,T,p);
	else 
		SearchBST(T->lchild,key,T,p);
}
 
//创建一个二叉排序树
void CreatBST(BiTree &T,int e)
{
	BiTree p,s,q;
	SearchBST(T,e,NULL,p);//找到带插入的位置。
	s=(BiTree)malloc(sizeof(BiTNode));
	s->data=e;
	s->lchild=NULL;
	s->rchild=NULL;
	if(!p)T=s;
	else if(e==p->data)//当待排序列中有相同的元素时,将其放在相同元素的右孩子位置。原来的右子树放在其右节点域。
	{
		q=p->rchild;
		p->rchild=s;
		s->rchild=q;
	}
	else if(e<p->data)
		p->lchild=s;
	else
		p->rchild=s;
}
 
//中序遍历二叉排序树
void InOrderTravese(BiTree T)
{
	BiTree p;
	Sqstack Sqt;
	InitStack(Sqt);
	p=T;
	while(p||Sqt.base!=Sqt.top)
	{
		if(p)
		{
			if(Sqt.top-Sqt.base>=Sqt.stacksize)
			{
				Sqt.base=(BiTree*)realloc(Sqt.base,(Sqt.stacksize+STACK_INCREMENT)*sizeof(BiTNode));
				if(!Sqt.base)
					exit(OVERFLOW);
				Sqt.top=Sqt.base+Sqt.stacksize;
				Sqt.stacksize+=STACK_INCREMENT;
			}
			*Sqt.top++=p;
			p=p->lchild;
		}
		else
		{
			p=*--Sqt.top;
			printf("%d ",p->data);
			p=p->rchild;
		}
	}
	printf("\n");
}
void main()
{
	int length;
	int bst[MAXSIZE];
	BiTree BST;
        BST=(BiTree)malloc(sizeof(BiTNode));
        BST=NULL;
	printf("***************************\n");
	printf("      二叉树排序算法       \n");
	printf("***************************\n");
	printf("请输入待排序序列的个数N (N<%d):",MAXSIZE);
	scanf("%d",&length);
	printf("\n");
	printf("请输入待排序的关键字:\n");
	for(int i=0;i<length;i++)
		scanf("%d",&bst[i]);
	printf("\n");
	for(int i=0;i<length;i++)
		CreatBST(BST,bst[i]);
	printf("输出二叉树排序结果:\n");
	InOrderTravese(BST);
	printf("\n");
	free(BST);
}


  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ST语言写二叉树排序算法可以这样实现:procedure sort(var a: array of integer); var root, cur, prev: ^Node; begin new(root); root^.data := a[0]; prev := root; for i := 1 to length(a) - 1 do begin new(cur); cur^.data := a[i]; cur^.parent := prev; if a[i] < prev^.data then prev^.left := cur else prev^.right := cur; prev := cur; end; inorder(root); end; procedure inorder(p: ^Node); begin if p <> nil then begin inorder(p^.left); write(p^.data); inorder(p^.right); end; end; ### 回答2: ST(Structured Text)语言是一种类似于Pascal的高级程序设计语言,常用于基于PLC(Programmable Logic Controller)的工控系统编程。在ST语言中,可以利用递归的方式来实现二叉树排序算法。 下面是用ST语言写二叉树排序算法的示例代码: PROGRAM BinarySearchTreeSort VAR root: POINTER TO Node; // 定义二叉树的根节点指针 // 定义节点结构体 Node: RECORD value: INT; // 节点的值 left: POINTER TO Node; // 左子节点指针 right: POINTER TO Node; // 右子节点指针 END_RECORD; // 插入节点到二叉树中的函数 FUNCTION InsertNode(VAR current: POINTER TO Node; value: INT): POINTER TO Node; BEGIN IF current = NIL THEN // 如果当前节点为空,则创建一个新节点并赋予其值 NEW(current); current^.value := value; current^.left := NIL; current^.right := NIL; ELSE // 如果当前节点不为空,则根据值的大小递归插入左子树或右子树 IF value < current^.value THEN current^.left := InsertNode(current^.left, value); ELSE current^.right := InsertNode(current^.right, value); END_IF; END_IF; RETURN current; END_FUNCTION; // 中序遍历二叉树的函数 PROCEDURE InOrderTraversal(node: POINTER TO Node); BEGIN IF node <> NIL THEN InOrderTraversal(node^.left); // 遍历左子树 // 输出当前节点的值 Print(' ', node^.value); InOrderTraversal(node^.right); // 遍历右子树 END_IF; END_PROCEDURE; // 主程序 VAR values: ARRAY[1..10] OF INT := [4, 2, 5, 1, 3, 6, 8, 7, 10, 9]; // 待排序的数组 i: INT; sortedTree: POINTER TO Node; BEGIN // 创建二叉树并插入节点 sortedTree := NIL; FOR i := 1 TO 10 DO sortedTree := InsertNode(sortedTree, values[i]); END_FOR; // 中序遍历二叉树并输出排序后的结果 Print('排序后的结果:'); InOrderTraversal(sortedTree); END_PROGRAM; 以上代码实现了一个二叉树排序算法。通过创建二叉树,并根据节点的值大小递归插入左子树或右子树,最后通过中序遍历二叉树可以得到排序后的结果。示例中给定了一个包含10个元素的数组,代码会将数组中的元素按照顺序插入到二叉树中,并输出排序后的结果。 ### 回答3: ST语言是Structured Text的缩写,是一种用于编写PLC(Programmable Logic Controller,可编程逻辑控制器)程序的编程语言。下面是使用ST语言编写二叉树排序算法的示例代码: VAR Type TreeNode : STRUCT Left : POINTER TO TreeNode; Value : INT; Right : POINTER TO TreeNode; END_STRUCT; treeRoot : POINTER TO TreeNode; sortedValues : ARRAY[1..N] OF INT; index : INT; PROCEDURE InsertNode(VAR root : POINTER TO TreeNode; value : INT); VAR tempNode : POINTER TO TreeNode; BEGIN IF root = NIL THEN NEW(root); root^.Left := NIL; root^.Value := value; root^.Right := NIL; ELSE IF value < root^.Value THEN InsertNode(root^.Left, value); ELSE InsertNode(root^.Right, value); END_IF; END_IF; END_PROCEDURE; PROCEDURE InOrderTraversal(node : POINTER TO TreeNode); BEGIN IF node <> NIL THEN InOrderTraversal(node^.Left); sortedValues[index] := node^.Value; index := index + 1; InOrderTraversal(node^.Right); END_IF; END_PROCEDURE; PROCEDURE BinaryTreeSort(values : ARRAY_OF_INT; size : INT); VAR i : INT; BEGIN index := 1; FOR i := 1 TO size DO InsertNode(treeRoot, values[i]); END_FOR; InOrderTraversal(treeRoot); END_PROCEDURE; END_VAR 请注意,以上代码只是一个示例,具体实现还需要根据PLC的具体规格和要求进行调整。另外,代码中使用的变量和数据类型也只是示例,请根据实际情况进行相应的更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值